package algorithms.evictpolicy;

public interface EvictPolicy<K> {


    /**
     * @param k       key
     * @param exists  是否存在
     * @param handler 淘汰处理程序
     * @return 是否放入缓存
     */
    boolean onPut(K k, boolean exists, EvictionHandler<K> handler);

    /**
     * @param k   key
     * @param hit 是否命中
     */
    void onGet(K k, boolean hit);

    void onRemove(K k, boolean exists);

    interface EvictionHandler<K> {
        default void onEvict(K... ks) {
            if (ks == null) return;
            for (K k : ks) {
                onEvict(k);
            }
        }

        void onEvict(K k);
    }

    interface BatchEvictionHandler<K> extends EvictionHandler<K> {

        void onEvict(K... ks);

        default void onEvict(K k) {
            //do nothing
        }
    }
}
